home *** CD-ROM | disk | FTP | other *** search
/ Linux Cubed Series 7: Sunsite / Linux Cubed Series 7 - Sunsite Vol 1.iso / system / linux-bo / etherboo.000 / etherboo / etherboot-2.0 / netboot-freebsd / netboot.h < prev    next >
C/C++ Source or Header  |  1996-06-01  |  8KB  |  347 lines

  1. /**************************************************************************
  2. NETBOOT -  BOOTP/TFTP Bootstrap Program
  3.  
  4. Author: Martin Renters
  5.   Date: Dec/93
  6.  
  7. **************************************************************************/
  8.  
  9. #if    defined(__linux) || defined(__BCC__)
  10. #include "linuxdef.h"
  11. #else
  12. #include <sys/types.h>
  13. #include <a.out.h>
  14. #include <netdb.h>
  15. #include <sys/param.h>
  16. #include <sys/socket.h>
  17. #include <sys/mount.h>
  18. #include <net/if.h>
  19. #include <netinet/in.h>
  20. #include <nfs/nfsv2.h>
  21. #include <nfs/nfsdiskless.h>
  22. #include <machine/bootinfo.h>
  23. #include <machine/cpufunc.h>
  24. #endif
  25.  
  26. #define ESC        0x1B
  27.  
  28. #ifndef DEFAULT_BOOTFILE
  29. #define DEFAULT_BOOTFILE    "/kernel"
  30. #endif
  31.  
  32. #ifndef MAX_TFTP_RETRIES
  33. #define MAX_TFTP_RETRIES    20
  34. #endif
  35.  
  36. #ifndef MAX_BOOTP_RETRIES
  37. #define MAX_BOOTP_RETRIES    20
  38. #endif
  39.  
  40. #ifndef MAX_ARP_RETRIES
  41. #define MAX_ARP_RETRIES        20
  42. #endif
  43.  
  44. #ifndef MAX_RPC_RETRIES
  45. #define MAX_RPC_RETRIES        20
  46. #endif
  47.  
  48. #ifndef TIMEOUT            /* Inter-packet retry in ticks 18/sec */
  49. #define TIMEOUT            180
  50. #endif
  51.  
  52. #ifndef NULL
  53. #define NULL    ((void *)0)
  54. #endif
  55.  
  56. #define TRUE        1
  57. #define FALSE        0
  58.  
  59. #define ETHER_ADDR_SIZE        6    /* Size of Ethernet address */
  60. #define ETHER_HDR_SIZE        14    /* Size of ethernet header */
  61. #define ETH_MIN_PACKET        64
  62. #define ETH_MAX_PACKET        1518
  63.  
  64. #define VENDOR_NONE    0
  65. #define VENDOR_WD    1
  66. #define VENDOR_NOVELL    2
  67. #define VENDOR_3COM    3
  68. #define VENDOR_3C509    4
  69.  
  70. #define FLAG_PIO    0x01
  71. #define FLAG_16BIT    0x02
  72. #define FLAG_790    0x04
  73.  
  74. #define ARP_CLIENT    0
  75. #define ARP_SERVER    1
  76. #define ARP_GATEWAY    2
  77. #define ARP_NS        3
  78. #define ARP_ROOTSERVER    4
  79. #define ARP_SWAPSERVER    5
  80. #define MAX_ARP        ARP_SWAPSERVER+1
  81.  
  82. #define IP        0x0800
  83. #define ARP        0x0806
  84.  
  85. #define BOOTP_SERVER    67
  86. #define BOOTP_CLIENT    68
  87. #define TFTP        69
  88. #define SUNRPC        111
  89.  
  90. #define RPC_SOCKET    620            /* Arbitrary */
  91.  
  92. #define IP_UDP        17
  93. #define IP_BROADCAST    0xFFFFFFFF
  94.  
  95. #define ARP_REQUEST    1
  96. #define ARP_REPLY    2
  97.  
  98. #define BOOTP_REQUEST    1
  99. #define BOOTP_REPLY    2
  100.  
  101. #define TAG_LEN(p)        (*((p)+1))
  102. #define RFC1048_COOKIE        { 99, 130, 83, 99 }
  103. #define RFC1048_PAD        0
  104. #define RFC1048_NETMASK        1
  105. #define RFC1048_GATEWAY        3
  106. #define RFC1048_HOSTNAME    12
  107. #define RFC1048_END        255
  108. #define BOOTP_VENDOR_LEN    64
  109.  
  110. #define    TFTP_MAX_PACKET    512
  111.  
  112. #define TFTP_RRQ    1
  113. #define TFTP_WRQ    2
  114. #define TFTP_DATA    3
  115. #define TFTP_ACK    4
  116. #define TFTP_ERROR    5
  117.  
  118. #define TFTP_CODE_EOF    1
  119. #define TFTP_CODE_MORE    2
  120. #define TFTP_CODE_ERROR    3
  121. #define TFTP_CODE_BOOT    4
  122. #define TFTP_CODE_CFG    5
  123.  
  124. #define PROG_PORTMAP    100000
  125. #define PROG_NFS    100003
  126. #define PROG_MOUNT    100005
  127.  
  128. #define MSG_CALL    0
  129. #define MSG_REPLY    1
  130.  
  131. #define PORTMAP_LOOKUP    3
  132.  
  133. #define MOUNT_ADDENTRY    1
  134. #define MOUNT_UMNTALL   4
  135. #define NFS_LOOKUP    4
  136. #define NFS_READ    6
  137.  
  138. #define NFS_READ_SIZE    1024
  139.  
  140.  
  141. #define AWAIT_ARP    0
  142. #define AWAIT_BOOTP    1
  143. #define AWAIT_TFTP    2
  144. #define AWAIT_RPC    3
  145.  
  146. struct arptable_t {
  147.     unsigned long ipaddr;
  148.     unsigned char node[6];
  149. } arptable[MAX_ARP];
  150.  
  151. struct arprequest {
  152.     unsigned short hwtype;
  153.     unsigned short protocol;
  154.     char hwlen;
  155.     char protolen;
  156.     unsigned short opcode;
  157.     char shwaddr[6];
  158.     char sipaddr[4];
  159.     char thwaddr[6];
  160.     char tipaddr[4];
  161. };
  162.  
  163. struct iphdr {
  164.     char verhdrlen;
  165.     char service;
  166.     unsigned short len;
  167.     unsigned short ident;
  168.     unsigned short frags;
  169.     char ttl;
  170.     char protocol;
  171.     unsigned short chksum;
  172.     char src[4];
  173.     char dest[4];
  174. };
  175.  
  176. struct udphdr {
  177.     unsigned short src;
  178.     unsigned short dest;
  179.     unsigned short len;
  180.     unsigned short chksum;
  181. };
  182.  
  183. struct bootp_t {
  184.     struct iphdr ip;
  185.     struct udphdr udp;
  186.     char bp_op;
  187.     char bp_htype;
  188.     char bp_hlen;
  189.     char bp_hops;
  190.     unsigned long bp_xid;
  191.     unsigned short bp_secs;
  192.     unsigned short unused;
  193.     char bp_ciaddr[4];
  194.     char bp_yiaddr[4];
  195.     char bp_siaddr[4];
  196.     char bp_giaddr[4];
  197.     char bp_hwaddr[16];
  198.     char bp_sname[64];
  199.     char bp_file[128];
  200.     char bp_vend[BOOTP_VENDOR_LEN];
  201. };
  202.  
  203. struct tftp_t {
  204.     struct iphdr ip;
  205.     struct udphdr udp;
  206.     unsigned short opcode;
  207.     union {
  208.         char rrq[TFTP_MAX_PACKET];
  209.         struct {
  210.             unsigned short block;
  211.             char download[TFTP_MAX_PACKET];
  212.         } data;
  213.         struct {
  214.             unsigned short block;
  215.         } ack;
  216.         struct {
  217.             unsigned short errcode;
  218.             char errmsg[TFTP_MAX_PACKET];
  219.         } err;
  220.     } u;
  221. };
  222.  
  223. struct rpc_t {
  224.     struct iphdr    ip;
  225.     struct udphdr    udp;
  226.     union {
  227.         char data[1400];
  228.         struct {
  229.             long id;
  230.             long type;
  231.             long rstatus;
  232.             long verifier;
  233.             long v2;
  234.             long astatus;
  235.             long data[1];
  236.         } reply;
  237.     } u;
  238. };
  239.  
  240. #define TFTP_MIN_PACKET    (sizeof(struct iphdr) + sizeof(struct udphdr) + 4)
  241.  
  242. /***************************************************************************
  243. RPC Functions
  244. ***************************************************************************/
  245. #define PUTLONG(val) {\
  246.     register int lval = val; \
  247.     *(rpcptr++) = ((lval) >> 24); \
  248.     *(rpcptr++) = ((lval) >> 16); \
  249.     *(rpcptr++) = ((lval) >> 8); \
  250.     *(rpcptr++) = (lval); \
  251.     rpclen+=4; }
  252.  
  253. /***************************************************************************
  254. External prototypes
  255. ***************************************************************************/
  256. /* main.c */
  257. extern void load P((void));
  258. extern int load_linux P((int root_mount_port,int swap_mount_port,
  259.     int root_nfs_port,char *kernel_handle));
  260. extern int linux_tftp P((unsigned int block,unsigned char *data,int len));
  261. extern int tftp P((char *name));
  262. extern int bootp P((void));
  263. extern int udp_transmit P((unsigned long destip, unsigned int srcsock,
  264.     unsigned int destsock, int len, char *buf));
  265. extern int await_reply P((int type, int ival, char *ptr));
  266. extern void default_netmask P((void));
  267. extern void decode_rfc1048 P((unsigned char *));
  268. extern unsigned short ipchksum P((unsigned short *, int len));
  269. extern void convert_ipaddr P((char *, char *));
  270.  
  271. /* bootmenu.c */
  272. extern int execute P((char *string));
  273. extern void bootmenu P((void));
  274.  
  275. /* <board>.c */
  276. extern void eth_reset P((void));
  277. extern int eth_probe P((void));
  278. extern void eth_transmit P((char *d, unsigned int t, unsigned int s, char *p));
  279. extern int eth_poll P((void));
  280. extern void eth_pio_read P((unsigned int src, unsigned char *dst, unsigned int cnt));
  281. extern void eth_pio_write P((unsigned char *src, unsigned int dst, unsigned int cnt));
  282. extern void DELAY P((int));
  283.  
  284. /* linuxloader.c */
  285. extern char *linux_add_cmdline P((char *string));
  286.  
  287. /* rpc.c */
  288. extern int rpclookup P((int addr, int prog, int ver));
  289. extern int nfs_mount P((int server, int port, char *path, char *fh));
  290. extern int nfs_umountall P((int server, int port));
  291. extern int nfs_lookup P((int server, int port, char *fh, char *path, char *file_fh));
  292. extern int nfs_read P((int server, int port, char *fh, int offset, int len, char *buffer));
  293. extern void rpc_err P((struct rpc_t *rpc));
  294. extern void nfs_err P((int err));
  295.  
  296. /* misc.c */
  297. extern void bcopy P((void *src, void *dst, int cnt));
  298. extern void bzero P((void *dst, int cnt));
  299. extern int bcompare P((void *src, void *dst, int cnt));
  300. extern char *substr P((char *a, char *b));
  301. extern int getdec P((char **));
  302. extern void twiddle P((void));
  303. extern void printf();        /* old style to avoid varargs */
  304. extern char *sprintf();
  305. extern int setip P((char *p, unsigned long *i));
  306. extern void gateA20 P((void));
  307.  
  308. /* start*.S */
  309. extern int getchar P((void));
  310. extern void putchar P((int));
  311. extern int iskey P((void));
  312. extern unsigned short memsize P((void));
  313. extern void start_linux P((void));
  314. extern void xstart P((unsigned long, unsigned long, unsigned long));
  315. extern unsigned long currticks P((void));
  316. extern int setjmp P((void *jmpbuf));
  317. extern void longjmp P((void *jmpbuf, int where));
  318. extern void exit P((int status));
  319.  
  320. /***************************************************************************
  321. External variables
  322. ***************************************************************************/
  323. /* main.c */
  324. extern char *kernel;
  325. extern char kernel_buf[];
  326. extern struct nfs_diskless nfsdiskless;
  327. extern int hostnamelen;
  328. extern unsigned long netmask;
  329. extern int   jmp_bootmenu[10];
  330.  
  331. /* <board>.h */
  332. extern char eth_driver[];
  333. extern char packet[];
  334. extern int packetlen;
  335. extern short aui;
  336.  
  337. /* bootmenu.c */
  338.  
  339. /* linuxloader.c */
  340. extern struct bootp_t bootp_reply;
  341.  
  342. /* rpc.c */
  343. extern int rpc_id;
  344.  
  345. /* created by linker */
  346. extern char _edata[], _end[];
  347.